//
// Created by ddleed on 2018/12/6.
//

#include "pcf8574.h"
#include "iic.h"
#include "delay.h"

uint8_t PCF8574_Init(void)
{
    uint8_t temp = 0;
	GPIO_InitTypeDef GPIO_Initure;
	__HAL_RCC_GPIOB_CLK_ENABLE();

	GPIO_Initure.Pin=GPIO_PIN_12;           //PB12
	GPIO_Initure.Mode=GPIO_MODE_INPUT;      //输入
	GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
	GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
	HAL_GPIO_Init(GPIOB,&GPIO_Initure);     //初始化

	IIC_Init();
	
	IIC_Start();
	IIC_Send_Byte(PCF8574_ADDR);
	temp = IIC_Wait_Ack();
	IIC_Stop();
	
	return temp;
	
	
}

/**
 * PCF8574读byte
 * 此芯片内部只有一个byte
 * 对应8个IO口的状态
 * 不需要指定read_addr
 * @return
 */
uint8_t PCF8574_Read_Byte(void)
{
    uint8_t temp = 0;
	IIC_Start();
	IIC_Send_Byte(PCF8574_ADDR | 0x01);
	IIC_Wait_Ack();
	temp = IIC_Read_Byte(0);
	return temp;
}

/**
 * PCF8574写byte
 * 此芯片内部只有一个byte
 * 对应8个IO口的状态
 * 不需要指定write_addr
 * @param data
 * @return
 */
uint8_t PCF8574_Write_Byte(uint8_t data)
{
	IIC_Start();
	IIC_Send_Byte(PCF8574_ADDR | 0x00);
	IIC_Wait_Ack();
	IIC_Send_Byte(data);
	IIC_Wait_Ack();
	IIC_Stop();
	delay_ms(10);
	return 0;
}

/**
 * PCF8574写一个bit
 * 相当于写IO口电平
 * @param bit 		0~7
 * @param state 	0 | 1
 *
	#define BEEP_IO         0		//蜂鸣器控制引脚  	P0
	#define AP_INT_IO       1   	//AP3216C中断引脚	P1
	#define DCMI_PWDN_IO    2    	//DCMI的电源控制引脚 P2
	#define USB_PWR_IO      3    	//USB电源控制引脚	P3
	#define EX_IO      	 	4    	//扩展IO,自定义使用 P4
	#define MPU_INT_IO      5   	//MPU9250中断引脚	P5
	#define RS485_RE_IO     6    	//RS485_RE引脚	P6
	#define ETH_RESET_IO    7    	//以太网复位引脚	P7
 */
void PCF8574_Write_Bit(uint8_t bit, uint8_t state)
{
	uint8_t data;

	data = PCF8574_Read_Byte();
	if(state == 0)
		data &= ~(1 << bit);
	else
		data |= 1 << bit;
	PCF8574_Write_Byte(data);
}

/**
 * PCF8574读一个bit
 * 相当于读IO口电平
 * @param bit 		0~7
 * @return
 */
uint8_t PCF8574_Read_Bit(uint8_t bit)
{
	uint8_t data;

	data = PCF8574_Read_Byte();
	if(data & (1 << bit))
		return 1;
	else
		return 0;
}
